RTS遊戲中單位控制及資源交換尤其重要,資源交換如使用較少的單位來擊敗敵人較多的單位,這時候攻擊力、冷卻時間、血量就尤為重要,因此今天來寫攻擊的方法。
[Networked]
TickTimer cooldownTimer { get; set; }
[Networked]
public float currentHealth { get; set; }
public bool canAttack => cooldownTimer.ExpiredOrNotRunning(Runner);
SimpleKCC simpleKCC;
AnimalMove animalMove;
BloodBar bloodBar;
[Rpc (RpcSources.All, RpcTargets.StateAuthority, HostMode = RpcHostMode.SourceIsHostPlayer)]
public void RPC_Damage(float damage, NetworkAnimal animal,RpcInfo info = default)
{
if (canAttack)
{
animal.BeDamaged(damage);
cooldownTimer = TickTimer.CreateFromSeconds(Runner, cooldownTime);
}
}
private void BeDamaged(float damge)
{
currentHealth -= damge;
}
為了讓所有人都能夠看到動物目前的血量,所以將當前血量設為聯網屬性,然而聯網屬性需要狀態授權才能夠被修改,故這邊使用RPC來讓狀態能夠更新,且將攻擊判定及冷卻都放在RPC中,以避免延遲問題。
TickTimer 是PhotonFusion中提供的一個類似於計時器的結構,目的是為了降低頻寬及模擬網路刷新的方法。這邊使用TickTimer來實作冷卻的功能。